www.gusucode.com > vc++ 远程控制示例源程序-源码程序 > vc++ 远程控制示例源程序-源码程序\code\PeerYouC\PeerHostTreeView.cpp

    // PeerHostTreeView.cpp : implementation file
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "PeerYouC.h"
#include "PeerHostTreeView.h"
#include "mainfrm.h"
#include "peerregeditlistview.h"
#include "peerregedittreeview.h"
#include "peerfilelistview.h"
#include "peerfileremotelistview.h"
#include "command.h"
#include "peersocket.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CPeerHostTreeView

IMPLEMENT_DYNCREATE(CPeerHostTreeView, CTreeView)

CPeerHostTreeView::CPeerHostTreeView()
{
}

CPeerHostTreeView::~CPeerHostTreeView()
{
}


BEGIN_MESSAGE_MAP(CPeerHostTreeView, CTreeView)
	//{{AFX_MSG_MAP(CPeerHostTreeView)
	ON_WM_CREATE()
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPeerHostTreeView drawing

void CPeerHostTreeView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CPeerHostTreeView diagnostics

#ifdef _DEBUG
void CPeerHostTreeView::AssertValid() const
{
	CTreeView::AssertValid();
}

void CPeerHostTreeView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CPeerHostTreeView message handlers

int CPeerHostTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CTreeView::OnCreate(lpCreateStruct) == -1)
		return -1;
	m_imagelist.Create(16,16,ILC_MASK,6,1);
	m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_HOST_SERVER));
	m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_HOST_HOST));
	m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_HOST_COMPUTER));
	m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_HOST_USER));
	m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_HOST_OS));
	m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_HOST_PROCESS));
	m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_HOST_MEM));
	m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_HOST_DISK));

	// TODO: Add your specialized creation code here
	CTreeCtrl &tree=this->GetTreeCtrl();
	tree.ModifyStyle(0,TVS_HASLINES|TVS_LINESATROOT|TVS_SHOWSELALWAYS|
		TVS_HASBUTTONS);
	tree.SetImageList(&m_imagelist,TVSIL_NORMAL);
	return 0;
}

void CPeerHostTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	CTreeCtrl& tree=GetTreeCtrl();
	HTREEITEM item;
	item=tree.GetSelectedItem();
	TVITEM tvitem;
	tvitem.mask=TVIF_TEXT;
	tvitem.hItem=item;
	tvitem.pszText=ADDRESS;
	tvitem.cchTextMax=16;
	if(tree.GetItem(&tvitem)&&inet_addr(tvitem.pszText)!=INADDR_NONE)
	{
		strcpy(ADDRESS,tvitem.pszText);
	}
	if(tree.GetParentItem(item)==tree.GetRootItem())
	{
		CMainFrame* pMainFrame=(CMainFrame*)AfxGetApp()->GetMainWnd();
		CPeerOperatorTabCtrl* operatortab=&(pMainFrame->m_wndOperatorTab);
		///////////////初始化注册表操作
		CSplitterWnd* regeditsplitter=&(operatortab->m_splitterwndregedit);
		CPeerRegeditTreeView* regedittree=(CPeerRegeditTreeView*)regeditsplitter->GetPane(0,0);
		CPeerRegeditListView* regeditlist=(CPeerRegeditListView*)regeditsplitter->GetPane(0,1);
		CTreeCtrl& regtree=regedittree->GetTreeCtrl();
		regtree.DeleteAllItems();
		CListCtrl& reglist=regeditlist->GetListCtrl();
		reglist.DeleteAllItems();
		HTREEITEM root,item;
		TVITEM	childflag;
		childflag.mask=TVIF_CHILDREN ;
		childflag.cChildren=1;
		root=regtree.InsertItem(ADDRESS,0,0);
		////////////////
		item=regtree.InsertItem("HKEY_CLASSES_ROOT",1,2,root);
		childflag.hItem=item;
		regtree.SetItem(&childflag);
		////////////////
		item=regtree.InsertItem("HKEY_CURRENT_USER",1,2,root);
		childflag.hItem=item;
		regtree.SetItem(&childflag);
		/////////////////
		item=regtree.InsertItem("HKEY_LOCAL_MACHINE",1,2,root);
		childflag.hItem=item;
		regtree.SetItem(&childflag);

		/////////////////
		item=regtree.InsertItem("HKEY_USERS",1,2,root);
		childflag.hItem=item;
		regtree.SetItem(&childflag);
		//////////////////
		item=regtree.InsertItem("HKEY_CURRENT_CONFIG",1,2,root);
		childflag.hItem=item;
		regtree.SetItem(&childflag);
		///////////////////////////////////////////////////
		/////////////文件操作初始化
		CSplitterWnd* filesplitter=&(operatortab->m_splitterwndfile);
		CPeerFileListView* localfile=(CPeerFileListView*)filesplitter->GetPane(0,0);
		CPeerFileRemoteListView* remotefile=(CPeerFileRemoteListView*)filesplitter->GetPane(0,1);
		remotefile->m_wndToolBar.m_title.SetWindowText(ADDRESS);
		CString driver;
		CComboBoxEx* combox;
		CComboBoxEx* rcombox;
		combox=(CComboBoxEx*)&localfile->m_wndToolBar.m_driver;
		rcombox=(CComboBoxEx*)&remotefile->m_wndToolBar.m_driver;
		//adding string to the combo box
		COMBOBOXEXITEM comitem;
		comitem.mask=CBEIF_TEXT|CBEIF_IMAGE|CBEIF_SELECTEDIMAGE;
		comitem.cchTextMax=16;
		DWORD maskdriver;
		DWORD drivertype;

		char sdriver[10];
		int count=0;
		while(CB_ERR!=combox->DeleteItem(0));
		if(!(maskdriver=GetLogicalDrives()))
			return ;
		for(int i=0;i<26;i++)
		{
			if(!(maskdriver>>i))
				break;
			if(maskdriver>>i&1)
			{
				sdriver[0]=i+'A';
				sdriver[1]=':';
				sdriver[2]=0;
				drivertype=GetDriveType(sdriver);
				if(drivertype==DRIVE_REMOVABLE)
				{
					comitem.iImage=0;
					comitem.iSelectedImage=0;
				}
				if(drivertype==DRIVE_FIXED)
				{
					comitem.iImage=1;
					comitem.iSelectedImage=1;
				}
				if(drivertype==DRIVE_CDROM)
				{
					comitem.iImage=2;
					comitem.iSelectedImage=2;
				}
				if(drivertype==DRIVE_REMOTE)
				{
					comitem.iImage=3;
					comitem.iSelectedImage=3;
				}
				comitem.iItem=count;
				count++;
				comitem.pszText=sdriver;
				combox->InsertItem(&comitem);
				if(strcmp(comitem.pszText,"C:")==0)
				{
				  combox->SetCurSel(comitem.iItem);
				  localfile->path="C:";
				}
				
			}
		}
		count=0;
		////得到远程服务器的驱动器////////////////
		while(CB_ERR!=rcombox->DeleteItem(0));
		WSAEVENT hevent=WSACreateEvent();
		if(!hevent)
		{
			WSACloseEvent(hevent);
			return;
		}
		SOCKET s;
		COMMAND com;
		DRIVER remotedriver;
		DWORD ret;
		if(!PeerCreateSocket(&s,PEER_STREAM))
		{
			WSACloseEvent(hevent);
			return;
		}
		if(!PeerConnectSocket(s,ADDRESS,7788))
		{
			WSACloseEvent(hevent);
			closesocket(s);
			return;
		}

		memset(&remotedriver,0,sizeof(remotedriver));
		com.CommandID=PEER_FILE_GETDRIVER;
		if(!PeerSendDataS(s,(char*)&com,sizeof(com),&ret,hevent))
		{
			WSACloseEvent(hevent);
			closesocket(s);
			return;
		}

		while(PeerRecvDataS(s,(char*)&remotedriver,sizeof(remotedriver),&ret,hevent))
		{
			if(remotedriver.drivertype==DRIVE_REMOVABLE)
			{
				comitem.iImage=0;
				comitem.iSelectedImage=0;
			}
			if(remotedriver.drivertype==DRIVE_FIXED)
			{
				comitem.iImage=1;
				comitem.iSelectedImage=1;
			}
			if(remotedriver.drivertype==DRIVE_CDROM)
			{
				comitem.iImage=2;
				comitem.iSelectedImage=2;
			}
			if(remotedriver.drivertype==DRIVE_REMOTE)
			{
				comitem.iImage=3;
				comitem.iSelectedImage=3;
			}
			comitem.iItem=count;
			count++;
			comitem.pszText=remotedriver.driver;
			rcombox->InsertItem(&comitem);
			if(strcmp(comitem.pszText,"C:")==0)
			{
			  rcombox->SetCurSel(comitem.iItem);
			  remotefile->path="C:";
			}
		}
//		WSACloseEvent(hevent);
		closesocket(s);
		///////列出文件//////////////////////////
		localfile->list.DeleteAllItems();
		remotefile->list.DeleteAllItems();
		int index=0;
		////本地//////
		HANDLE hlocalfile;
		WIN32_FIND_DATA findd;
		CString nowdriver;
		combox->GetLBText(combox->GetCurSel(),nowdriver);
		nowdriver+="\\*";
		memset(&findd,0,sizeof(findd));

		int imagecount;
		imagecount=localfile->imagelists.GetImageCount();
		for(int j=1;j<imagecount;j++)
		{
			localfile->imagelists.Remove(j);
			localfile->imagelistb.Remove(j);
		}
		CImageList* pSmallImage,* pBigImage;
		pSmallImage=localfile->list.GetImageList(LVSIL_SMALL);
		pBigImage=localfile->list.GetImageList(LVSIL_NORMAL);

		if((hlocalfile=FindFirstFile( nowdriver,&findd))==INVALID_HANDLE_VALUE)
		{
			WSACloseEvent(hevent);
			return ;
		}
		SHFILEINFO shfi;
		memset(&shfi,0,sizeof(shfi));
		SHGetFileInfo(findd.cFileName, 
			FILE_ATTRIBUTE_NORMAL,
			&shfi, sizeof(shfi),
			SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME );

		int indeximage;
		indeximage=pSmallImage->Add(shfi.hIcon);
				   pBigImage->Add(shfi.hIcon);
		
		DWORD len;
		CTime time;
		char slen[30];
		CString stime;

		index=localfile->list.GetItemCount();
		localfile->list.InsertItem(index,".",0);
		localfile->list.SetItem(index,1,LVIF_TEXT,"文件夹",0,0,0,NULL);
		index=localfile->list.GetItemCount();
		localfile->list.InsertItem(index,"..",0);
		localfile->list.SetItem(index,1,LVIF_TEXT,"文件夹",0,0,0,NULL);
		index=localfile->list.GetItemCount();

		if(strcmp(findd.cFileName,".")!=0&&
					strcmp(findd.cFileName,"..")!=0)
		{
			localfile->list.InsertItem(index,findd.cFileName,
				findd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?0:indeximage);
			localfile->list.SetItem(index,1,LVIF_TEXT,findd.dwFileAttributes&
				FILE_ATTRIBUTE_DIRECTORY?"文件夹":shfi.szTypeName,0,0,0,NULL);
		
			len=(findd.nFileSizeHigh*MAXDWORD+findd.nFileSizeLow)/1024;
			sprintf(slen,"%dK",len);
			localfile->list.SetItem(index,2,LVIF_TEXT,findd.dwFileAttributes&
				FILE_ATTRIBUTE_DIRECTORY?"":slen,0,0,0,NULL);
			time=findd.ftLastWriteTime;
			CString stime=time.Format("%Y-%m-%d %H:%M:%S");
			localfile->list.SetItem(index,3,LVIF_TEXT,stime,0,0,0,NULL);

		}
		while(hlocalfile)
		{
			if(FindNextFile(hlocalfile,&findd))
			{
				if(strcmp(findd.cFileName,".")==0||
					strcmp(findd.cFileName,"..")==0)
					continue;
				memset(&shfi,0,sizeof(shfi));
				SHGetFileInfo(findd.cFileName, 
					FILE_ATTRIBUTE_NORMAL,
					&shfi, sizeof(shfi),
					SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME );
				indeximage=pSmallImage->Add(shfi.hIcon);
				           pBigImage->Add(shfi.hIcon);
			
				index=localfile->list.GetItemCount();
				localfile->list.InsertItem(index,findd.cFileName,
					findd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?0:indeximage);
				localfile->list.SetItem(index,1,LVIF_TEXT,findd.dwFileAttributes&
					FILE_ATTRIBUTE_DIRECTORY?"文件夹":shfi.szTypeName,0,0,0,NULL);
				len=(findd.nFileSizeHigh*MAXDWORD+findd.nFileSizeLow)/1024;
				sprintf(slen,"%dK",len);
				localfile->list.SetItem(index,2,LVIF_TEXT,findd.dwFileAttributes&
					FILE_ATTRIBUTE_DIRECTORY?"":slen,0,0,0,NULL);
				time=findd.ftLastWriteTime;
				stime=time.Format("%Y-%m-%d %H:%M:%S");
				localfile->list.SetItem(index,3,LVIF_TEXT,stime,0,0,0,NULL);
			}
			else
			{
				if(GetLastError()==ERROR_NO_MORE_FILES)
					break;
			}
		}
		FindClose(hlocalfile);
		/////远程//////////////////
		CString Mess;
		Mess="返回目录:\"" +remotefile->path+"\" 的所有文件信息!";
		if(!PeerCreateSocket(&s,PEER_STREAM))
		{
			Message(Mess.GetBuffer(Mess.GetLength()),"失败");
			WSACloseEvent(hevent);
			return;
		}
		if(!PeerConnectSocket(s,ADDRESS,7788))
		{
			Message(Mess.GetBuffer(Mess.GetLength()),"失败");
			WSACloseEvent(hevent);
			closesocket(s);
			return;
		}
		pSmallImage=remotefile->list.GetImageList(LVSIL_SMALL);
		pBigImage=remotefile->list.GetImageList(LVSIL_NORMAL);
		com.CommandID=PEER_FILE_GETATTRIB;
		if(!PeerSendDataS(s,(char*)&com,sizeof(com),&ret,hevent))
		{
			Message(Mess.GetBuffer(Mess.GetLength()),"失败");
			WSACloseEvent(hevent);
			closesocket(s);
			return;
		}
		FILEATTRIB fileattrib;
		rcombox->GetLBText(rcombox->GetCurSel(),nowdriver);
		nowdriver+="\\*";
		strcpy(fileattrib.filename,nowdriver);
		if(!PeerSendDataS(s,(char*)&fileattrib,sizeof(fileattrib),&ret,hevent))
		{
			Message(Mess.GetBuffer(Mess.GetLength()),"失败");
			WSACloseEvent(hevent);
			closesocket(s);
			return;
		}
		index=remotefile->list.GetItemCount();
		remotefile->list.InsertItem(index,".",0);
		remotefile->list.SetItem(index,1,LVIF_TEXT,"文件夹",0,0,0,NULL);
		index=remotefile->list.GetItemCount();
		remotefile->list.InsertItem(index,"..",0);
		remotefile->list.SetItem(index,1,LVIF_TEXT,"文件夹",0,0,0,NULL);
		index=remotefile->list.GetItemCount();
		while(PeerRecvDataS(s,(char*)&fileattrib,sizeof(fileattrib),&ret,hevent))
		{
			SHGetFileInfo(fileattrib.filename, 
					FILE_ATTRIBUTE_NORMAL,
					&shfi, sizeof(shfi),
					SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME );
			indeximage=pSmallImage->Add(shfi.hIcon);
				       pBigImage->Add(shfi.hIcon);
		
			index=remotefile->list.GetItemCount();
			remotefile->list.InsertItem(index,fileattrib.filename,
				strcmp(fileattrib.attrib,"文件夹")==0?0:indeximage);
			remotefile->list.SetItem(index,1,LVIF_TEXT,fileattrib.attrib,0,0,0,NULL);
			remotefile->list.SetItem(index,2,LVIF_TEXT,fileattrib.len,0,0,0,NULL);
			remotefile->list.SetItem(index,3,LVIF_TEXT,fileattrib.time,0,0,0,NULL);
		}
		Message(Mess.GetBuffer(Mess.GetLength()),"成功");
		WSACloseEvent(hevent);
		closesocket(s);
	}

	*pResult = 0;
}